<?php

class FacturacionsController extends AppController {

    var $name = 'Facturacions';
    var $uses = array('Cotizacion', 'CotizacionDetalle', 'Facturacion', 'FacturacionDetalle', 'InstrumentoPago', 'RetencionTarjeta', 'Material', 'Lapso', 'Cliente', 'FormasPago', 'TiendaLocal', 'Usuario');
    var $helpers = array('Formulario', 'Interfaz', 'AjaxAG');
    var $components = array('Interfaz', 'Maestro');
    var $layout = "ajax";
    var $paginate = array('limit' => 10, 'order' => array('Facturacion.id' => 'DESC'));

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }

    public function index($busqueda = null) {
        extract($this->request->data);
        $data = null;
        $idCliente = null;
        $condiciones = array();
        $condicionesModelo = array();
        $condicionesCliente = array();
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
        $condiciones['Facturacion.estatus !='] = 0;
        
        if(!empty($fechaInicio))
            $condiciones['DATE(Facturacion.fecha) BETWEEN ? AND ?'] = array($fechaInicio, $fechaFin);
        
        if(!empty($busqueda)){
            $condicionesModelo['Facturacion.numero ILIKE'] = "%$busqueda%";
            $idCliente = $this->Cliente->buscar_clientes($busqueda);
            if (!empty($idCliente))
                $condicionesCliente['Facturacion.cliente_id'] = $idCliente;
        } else {
            if(!empty($punto_id))
                $condiciones['Facturacion.punto_id'] = $punto_id;
        }
        
        if(!empty($selectFD)) {
            if($selectFD != 'F') {
                $condiciones['Facturacion.estatus'] = $selectFD;
            } else {
                $facturasFletes = $objFac->find('all', array('fields' => array('Facturacion.id', 'Facturacion.padre_id'), 'conditions' => array('Facturacion.padre_id >' => 0), 'order' => 'Facturacion.id DESC'));
                $idsFacturas = array();
                foreach ($facturasFletes as $valores) {
                    $idsFacturas[] = $valores['Facturacion']['id'];
                    $idsFacturas[] = $valores['Facturacion']['padre_id'];
                }
                $condiciones['Facturacion.id'] = $idsFacturas;
            }
        }

        $data = $this->paginate($objFac, array($condiciones, 'OR' => array($condicionesModelo, $condicionesCliente)));
        $this->set('url', $busqueda);
        $this->set('data', $data);
    }
    
    public function historial() {
        extract($this->request->data);
        $data = null;
        $condiciones['DATE(Facturacion.creado)'] = date('Y-m-d');
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
        
        if(!empty($selectFD)) {
            if($selectFD != 'F') {
                $condiciones['Facturacion.estatus'] = $selectFD;
            } else {
                $facturasFletes = $objFac->find('all', array('fields' => array('Facturacion.id', 'Facturacion.padre_id'), 'conditions' => array('Facturacion.padre_id >' => 0), 'order' => 'Facturacion.id DESC'));
                $idsFacturas = array();
                foreach ($facturasFletes as $valores) {
                    $idsFacturas[] = $valores['Facturacion']['id'];
                    $idsFacturas[] = $valores['Facturacion']['padre_id'];
                }
                $condiciones['Facturacion.id'] = $idsFacturas;
            }
        }
        
        if(!empty($punto_id))
            $condiciones['Facturacion.punto_id'] = $punto_id;
        
        $data = $this->paginate($objFac, array($condiciones));
        $this->set('data', $data);
    }

    public function buscar_detalle_cotizacion() {
        if($this->validar_cierre()) {
            extract($this->request->data);
            $idDoc = $this->Interfaz->id($idDoc);
            $tiendaSesion = $this->Session->read('tiendaBD');
            $observacion = '';
            if($tabla == 'F') {
                $objModelo = $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
                $datos = $objFac->find('first', array('fields' => array('cotizacion_id', 'observacion'), 'conditions' => array('Facturacion.id' => $idDoc)));
                $observacion .= $datos['Facturacion']['observacion'];
            } else {
                $objModelo = $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
                $datos = $objCot->find('first', array('fields' => array('observaciones'), 'conditions' => array('Cotizacion.id' => $idDoc)));
                if($datos['Cotizacion']['observaciones'] != "CADUCA A LOS TRES (03) DIAS DE EMITIDA")
                    $observacion .= str_replace("CADUCA A LOS TRES (03) DIAS DE EMITIDA - ", "", $datos['Cotizacion']['observaciones']);
            }
            $informacion = $objModelo->query("select fnc_obtener_existencia_material_venta($idDoc, '$fecha', '$tabla') as resultado");
            echo "{$observacion}_{$informacion[0][0]['resultado']}";
            $this->autoRender = false;
        }
    }

    public function anular() {
        if($this->validar_cierre()) {
            extract($this->request->data);
            $tienda = substr($this->Session->read('codigo_punto'), 1);
            $id = $this->Interfaz->id($id);
            $usuarioID = $this->Interfaz->id($this->Session->read('usuario_id'));
            $tiendaSesion = $this->Session->read('tiendaBD');
            $objFact = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
            $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);

            $resultadoAnular = $objFact->find('first', array('fields' => array('Facturacion.cierre_caja_id', 'Facturacion.cotizacion_id'), 'conditions' => array('Facturacion.id' => $id))); 
            
            if(isset($resultadoAnular) && $resultadoAnular['Facturacion']['cierre_caja_id'] == 0) {
                $informacion = $objFact->query("select fn_anula_factura('$tienda', $id, $usuarioID) as resultado");
                $datos = explode("|", $informacion[0][0]['resultado']);
                $resultadoFlete = $objFact->find('first', array('fields' => array('Facturacion.id', 'Facturacion.numero'), 'conditions' => array('Facturacion.padre_id' => $id)));
                $infoCotizacion = array('id' => $resultadoAnular['Facturacion']['cotizacion_id'], 'estatus' => 1);
                $objCot->save($infoCotizacion);
                if(!empty($resultadoFlete) && $datos[0]==true)
                    $informacion = $objFact->query("select fn_anula_factura('$tienda', {$resultadoFlete['Facturacion']['id']}, $usuarioID) as resultado");
                echo $informacion[0][0]['resultado'];
            }
            else {
                echo 'NO|';
            }   
            $this->autoRender = false;
        }
    }

    public function logs() {
        extract($this->request->data);
        $idFac = $this->Interfaz->id($idFac);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
        
        $logFacturaciones = $objFac->query("SELECT * FROM fnc_log_documento($idFac,'FAC') AS (id integer,documento character varying,fecha timestamp without time zone,tipo integer,descripcion character varying);");
   
        $this->set('log', $logFacturaciones);
    }

    public function detalle() {
        extract($this->request->data);
        $id = $this->Interfaz->id($id);
        $codigoFlete = $controlFlete = '';
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFact = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
        $data = $objFact->find('first', array('conditions' => array('Facturacion.id' => $id)));
        $objFacDet = $this->Maestro->modelo('punto', 'FacturacionDetalle', $tiendaSesion);
        $dataDetalle = $objFacDet->find('list', array('fields' => 'material_id, cantidad', 'conditions' => array('FacturacionDetalle.factura_id' => $id)));
        list($fecha) = explode(' ', $data['Facturacion']['fecha']);
        $fechaInvertida = implode('-', array_reverse(explode('-', $fecha)));
        $productos = $objFact->query("select * FROM fnc_obtener_existencia_material_venta($id, '" . $fechaInvertida . "', 'F')");
        $resultadoFlete = $objFact->find('first', array('fields' => array('Facturacion.id', 'Facturacion.numero', 'Facturacion.numero_control'), 'conditions' => array('Facturacion.padre_id' => $id)));

        if (!empty($resultadoFlete))
            $flete = $objFact->query("select * FROM fnc_obtener_existencia_material_venta('{$resultadoFlete['Facturacion']['id']}', '$fechaInvertida', 'F')");
        else
            $flete = null;

        $datosUsuario = $this->Usuario->find('first', array('fields' => 'Usuario.usuario', 'conditions' => array('Usuario.id' => $data['Facturacion']['usuario_id'])));

        $this->set('usuario', $datosUsuario['Usuario']['usuario']);
        $this->set('url', $id);
        $this->set('data', $data);
        $this->set('dataDetalle', $dataDetalle);
        $this->set('dataFlete', $resultadoFlete);
        $this->set('productos', $productos);
        $this->set('tienda', $tiendaSesion);
        $this->set('flete', $flete);

        if(!empty($resultadoFlete)) {
            $codigoFlete = $resultadoFlete['Facturacion']['numero'];
            $controlFlete = $resultadoFlete['Facturacion']['numero_control'];
            $this->set('idFlete', $resultadoFlete['Facturacion']['id']);
        }
        
        $this->set('codigoFlete', $codigoFlete);
        $this->set('controlFlete', $controlFlete);
    }

    public function instrumento_servicios($totalServicios, &$forma_pago, &$monto, &$banco, &$referencia, &$forma_pago_flete, &$monto_flete, &$banco_flete, &$referencia_flete) {
        if ($totalServicios > 0) {
            foreach ($forma_pago as $indice => $valor) {
                $forma_pago_flete[$indice] = $valor;
                $banco_flete[$indice] = $banco[$indice];
                $referencia_flete[$indice] = $referencia[$indice];
                if ($monto[$indice] > $totalServicios) {
                    $monto_flete[$indice] = $totalServicios;
                    $monto[$indice] = $monto[$indice] - $totalServicios;
                    $totalServicios = 0;
                } else {
                    $totalServicios = $totalServicios - $monto[$indice];
                    $monto_flete[$indice] = $monto[$indice];
                    $monto[$indice] = 0;
                    unset($monto[$indice]);
                    unset($forma_pago[$indice]);
                    unset($banco[$indice]);
                    unset($referencia[$indice]);
                }
                if ($totalServicios == 0)
                    return true;
            }
            if ($totalServicios > 0)
                $this->instrumento_servicios($totalServicios, $forma_pago, $monto, $banco, $referencia, $forma_pago_flete, $monto_flete, $banco_flete, $referencia_flete);
            else
                return true;
        }
        return true;
    }

    public function guardar() {
        if($this->validar_cierre()){
            extract($this->request->data);
            $error = $guardaFactura = true;
            $usuarioID = $this->Interfaz->id($this->Session->read('usuario_id'));
            $configPunto = $this->Session->read('configPunto');
            
            if($configPunto['Punto']['fac_dir'] == 1) {
                $idCot = $this->generarCotizacion($this->request->data);
                $sep = split('_', $idCot);
                if($sep[0] == '2') {
                    echo $idCot;
                    die();
                } else
                    $idCot = $sep[1];
            }
            
            $idCot = $this->Interfaz->id($idCot);
            $productos = json_decode($productos, true);
            $cantidades = json_decode($cantidades, true);
            $nuevoID = str_replace('-', '', $num_form);
            $fecha = "fecha_$nuevoID";
            $programa_id = "programa_id_$nuevoID";
            $programa_id = $$programa_id;
            $tipodeventa = "tipodeventa_$nuevoID";
            $tipodeventa = $$tipodeventa;
            $lapso_id = "lapso_id_$nuevoID";
            $lapso_id = $$lapso_id;
            $fechaFinal = $$fecha;
            $clienteID = $this->Interfaz->id($this->request->data['id2']);
            $lapso_id = (!empty($lapso_id)) ? $lapso_id : 1;
            $facturacion['numero'] = '001';
            $facturacion['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
            $facturacion['cliente_id'] = $clienteID;
            $facturacion['usuario_id'] = $usuarioID;
            $facturacion['tipodeventa'] = $tipodeventa;
            $facturacion['punto_id'] = $this->Session->read('punto_id');
            $facturacion['cotizacion_id'] = $idCot;
            $facturacion['fecha'] = 'now()';
            $facturacion['monto'] = $montoPagar;
            $facturacion['observacion'] = $this->Interfaz->mayuscula($observacion);
            $facturacion['cambio'] = round($cambio,2);
            $tipo_cliente_id = (isset($tipo_cliente_id) && !empty($tipo_cliente_id)) ? $tipo_cliente_id : 1;
            $msjError = '';
            $errores = array();
            $genera_cobranza = false;
            $montoRestarCobranza = $montoRestarFac = $montoRestarFacFlete = 0;

            $tiendaSesion = $this->Session->read('tiendaBD');
            $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
            $objFacDet = $this->Maestro->modelo('punto', 'FacturacionDetalle', $tiendaSesion);
            $objDetSer = $this->Maestro->modelo('punto', 'FacturacionSerial', $tiendaSesion);
            $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
            $objInstrumento = $this->Maestro->modelo('punto', 'InstrumentoPago', $tiendaSesion);
            $objRetencion = $this->Maestro->modelo('punto', 'RetencionTarjeta', $tiendaSesion);
            $objNotaCredito = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
            $objNotaDebito = $this->Maestro->modelo('punto', 'NotaDebito', $tiendaSesion);
            $objCartaOrden = $this->Maestro->modelo('punto', 'CartaOrden', $tiendaSesion);
            //$facturacion['monto'] = $montoPagar - $totalServicios; //Se resta el total de servicio incluido el impuesto
            $cotizacionProcesada = $objCot->find('first', array('fields' => array('Cotizacion.id'), 'conditions' => array('Cotizacion.id' => $idCot, 'Cotizacion.estatus' => 1)));
            $formasPagoCredito = $this->FormasPago->find('list', array('fields' => array('nombre', 'id'), 'conditions' => array('FormasPago.estatus' => 1, 'FormasPago.credito' => 1)));

            if(!empty($cotizacionProcesada)) {
                $infoCotizacion = array('id' => $idCot, 'estatus' => 2, 'fecha_procesada' => 'now()');
                $objCot->save($infoCotizacion);
            } else
                $guardaFactura = false;

            foreach ($forma_pago as $indice => $valor) {
                $monto[$indice] = $this->Interfaz->miles_postgres($monto[$indice]);
                if(in_array($valor, $formasPagoCredito)) {
                    $facturacion['tipodeventa'] = 1;
                    $montoRestarCobranza += $monto[$indice];
                } else
                    $genera_cobranza = true;
            }

            $objFac->query('BEGIN WORK');
            if($guardaFactura) {
                if ($objFac->save($facturacion)) {
                    $detalleProductos = $this->buscar_producto($productos, $tipo_cliente_id, $programa_id, $lapso_id, $fechaFinal, null, $clienteID);
                    $facturacionDetalle = array();
                    $servicios = array();
                    $totalServicios = 0;
                    $conServicios = 0;
                    $detalleServicios = array();
                    $detalleSuperv = array();
                    $detalleSupervCant = array();
                    $datoServicios = $this->Material->find('all', array('fields' => array('Material.id'), 'conditions' => array('Material.tipoarticulos_id' => 2)));
                    foreach ($datoServicios as $datSer) {
                        $servicios[] = $datSer['Material']['id'];
                    }

                    foreach ($detalleProductos as $indice => $valor) {
                        $idPro = array_search($valor['Material']['id'], $productos);
                        $cantSuperv = $cantidades[$idPro] + $valor['Material']['venta'];
                        if (
                            ($cantidades[$idPro] > $valor['Material']['existencia']) ||
                            (empty($valor['Material']['existencia'])) ||
                            ($valor['Material']['existencia'] <= 0) ||
                            (empty($valor['Material']['precio'])) ||
                            ($valor['Material']['precio'] <= 0) ||
                            (($valor['Material']['maximo'] > 0) && ($cantSuperv > $valor['Material']['maximo']))
                        ) {
                            $errores[$valor['Material']['id']]['error'] = '';
                            if (($cantidades[$idPro] > $valor['Material']['existencia']) || (empty($valor['Material']['existencia'])) || ($valor['Material']['existencia'] <= 0))
                                $errores[$valor['Material']['id']]['error'] = "La Cantidad escogida supera la Existencia";
                            if ((empty($valor['Material']['precio'])) || ($valor['Material']['precio'] <= 0)) {
                                $errores[$valor['Material']['id']]['error'] .= (!empty($errores[$valor['Material']['id']]['error'])) ? '<br/>' : '';
                                $errores[$valor['Material']['id']]['error'] .= "El precio del producto es invalido";
                            }
                            if ($cantSuperv > $valor['Material']['maximo']) {
                                $errores[$valor['Material']['id']]['error'] .= (!empty($errores[$valor['Material']['id']]['error'])) ? '<br/>' : '';
                                $errores[$valor['Material']['id']]['error'] .= "Supera la cantidad maxima permitida de venta";
                            }
                            $errores[$valor['Material']['id']]['nombre'] = "({$valor['Material']['codigo']})<br/>{$valor['Material']['nombre']}";
                            $errores[$valor['Material']['id']]['precio'] = $valor['Material']['precio'];
                            $errores[$valor['Material']['id']]['cantidad'] = $cantidades[$idPro];
                            $errores[$valor['Material']['id']]['existencia'] = $valor['Material']['existencia'];
                            $errores[$valor['Material']['id']]['vendido'] = $cantSuperv;
                            $errores[$valor['Material']['id']]['maximo'] = ($valor['Material']['maximo'] - $valor['Material']['venta']);
                        } else if (in_array($valor['Material']['id'], $servicios)) {
                            $conServicios++;
                            //$totalServicios[$valor['Material']['id']]= (isset($totalServicios[$valor['Material']['id']])) ? $totalServicios[$valor['Material']['id']] + $cantidades[$idPro] : $cantidades[$idPro];
                            $totalServicios += round(($cantidades[$idPro] * $valor['Material']['precio']), 2) + round(($cantidades[$idPro] * $valor['Material']['precio'] * $valor['Material']['impuesto']) / 100, 2);
                            $detalleServicios[$valor['Material']['id']]['Material']['id'] = $valor['Material']['id'];
                            $detalleServicios[$valor['Material']['id']]['Material']['usuario_id'] = $facturacion['usuario_id'];
                            $detalleServicios[$valor['Material']['id']]['Material']['almacen_id'] = 1;
                            $detalleServicios[$valor['Material']['id']]['Material']['cantidad'] = $cantidades[$idPro];
                            $detalleServicios[$valor['Material']['id']]['Material']['precio'] = $valor['Material']['precio'];
                            $detalleServicios[$valor['Material']['id']]['Material']['costo'] = $valor['Material']['costo'];
                            $detalleServicios[$valor['Material']['id']]['Material']['impuesto'] = $valor['Material']['impuesto'];
                        } else {
                            $facturacionDetalle[$indice]['FacturacionDetalle']['factura_id'] = $objFac->id;
                            $facturacionDetalle[$indice]['FacturacionDetalle']['material_id'] = $valor['Material']['id'];
                            $facturacionDetalle[$indice]['FacturacionDetalle']['usuario_id'] = $facturacion['usuario_id'];
                            $facturacionDetalle[$indice]['FacturacionDetalle']['almacen_id'] = 1;
                            $facturacionDetalle[$indice]['FacturacionDetalle']['cantidad'] = $cantidades[$idPro];
                            $facturacionDetalle[$indice]['FacturacionDetalle']['precio'] = $valor['Material']['precio'];
                            $facturacionDetalle[$indice]['FacturacionDetalle']['costo'] = $valor['Material']['costo'];
                            $facturacionDetalle[$indice]['FacturacionDetalle']['impuesto'] = $valor['Material']['impuesto'];
                        }
                        if ($valor['Material']['maximo'] > 0) {
                            $detalleSuperv[] = $valor['Material']['id'];
                            $detalleSupervCant[] = $cantidades[$idPro];
                        }
                    }

                    if (count($errores) > 0) {
                        $objFac->query('ROLLBACK');
                        echo json_encode($errores);
                    } else {
                        $exito = 1;
                        if ($objFacDet->saveAll($facturacionDetalle)) {
                            $detalleIds = $objFacDet->inserted_ids;
                            if ($conServicios > 0) { // tiene servicios
                                //Si se manejan distintos servicios hay que determinar cual es el monto Total
                                $forma_pago_flete = $monto_flete = $banco_flete = $referencia_flete = array();
                                $this->instrumento_servicios($totalServicios, $forma_pago, $monto, $banco, $referencia, $forma_pago_flete, $monto_flete, $banco_flete, $referencia_flete);
                            }
                            
                            $instrumentoPago = $id_notas_carta = $id_notas_credito = array();
                            $tienda = substr($this->Session->read('codigo_punto'), 1);
                            $monto_efectivo = 0;
                            //$formasPagoNoGenNDC = $this->FormasPago->find('list', array('fields' => array('nombre', 'id'), 'conditions' => array('FormasPago.estatus' => 1, 'FormasPago.genera_ndc' => 0)));
                            foreach ($forma_pago as $indice => $valor) {
                                if($valor == 12) { // Credito
                                    $dataNotaDebito = array();
                                    $dataNotaDebito['NotaDebito']['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                                    $dataNotaDebito['NotaDebito']['usuario_id'] = $usuarioID;
                                    $dataNotaDebito['NotaDebito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                                    $dataNotaDebito['NotaDebito']['cierre_caja_id'] = 0;
                                    $dataNotaDebito['NotaDebito']['numero'] = '001';
                                    $dataNotaDebito['NotaDebito']['nombre'] = 'FACTURA';
                                    $dataNotaDebito['NotaDebito']['monto'] = $monto[$indice];
                                    $dataNotaDebito['NotaDebito']['doc_referencia'] = '-----';
                                    $dataNotaDebito['NotaDebito']['id_referencia'] = $objFac->id;
                                    $dataNotaDebito['NotaDebito']['punto_id'] = $this->Session->read('punto_id');
                                    if($objNotaDebito->saveAll($dataNotaDebito)){
                                        //va bien jesus tiene que determinar como va a validar la transaccion
                                        $id_notas_credito[] = $objNotaDebito->id;
                                        $exito*=1;
                                    } else {
                                        //Fallo registro hay que deshacer todo
                                        $exito = 0;
                                        break;
                                    }
                                //} elseif (in_array($valor, $formasPagoNoGenNDC)) { //Acumula todo lo que no genera NDC
                                } elseif ($valor == 1) //Acumula todo lo que es efectivo
                                    $monto_efectivo += $monto[$indice];
                                
                                if(in_array($valor, $formasPagoCredito))
                                    $montoRestarFac += $monto[$indice];
                                
                                $porcentajeRet = $montoRet = $porcentajeRetIslr = $montoRetIslr = 0;
                                $detalleRetencion = $objRetencion->find('first', array('fields' => array('RetencionTarjeta.porreten', 'RetencionTarjeta.porreten_islr'), 'conditions' => array('RetencionTarjeta.estatus' => 1, 'RetencionTarjeta.formadepago_id' => $valor, 'RetencionTarjeta.banco_id' => $banco[$indice])));

                                if (!empty($detalleRetencion)) {
                                    $porcentajeRet = $detalleRetencion['RetencionTarjeta']['porreten'];
                                    $montoRet = round($monto[$indice] * ($detalleRetencion['RetencionTarjeta']['porreten'] / 100),2);
                                    $porcentajeRetIslr = $detalleRetencion['RetencionTarjeta']['porreten_islr'];
                                    //$montoRetIslr = round($monto[$indice] * ($detalleRetencion['RetencionTarjeta']['porreten_islr'] / 100),2);
                                    $montoRetIslr = round(($monto[$indice]/112) * $detalleRetencion['RetencionTarjeta']['porreten_islr'],2);
                                }

                                $instrumentoPago[$indice]['InstrumentoPago']['tipo_instrumento'] = 1; //Imagino esto es si es credito o contado
                                $instrumentoPago[$indice]['InstrumentoPago']['factura_id'] = $objFac->id;
                                $instrumentoPago[$indice]['InstrumentoPago']['formapago_id'] = $valor;
                                $instrumentoPago[$indice]['InstrumentoPago']['monto'] = $monto[$indice];
                                $numReferencia = explode('_', $referencia[$indice]);

                                if (count($numReferencia) > 1) {
                                    if ($numReferencia[0] == 3) { // Nota de credito
                                        $instrumentoPago[$indice]['InstrumentoPago']['notacredito_id'] = $numReferencia[1];
                                        $objNotaCredito->updateAll(array('NotaCredito.pagado' => "NotaCredito.pagado + {$monto[$indice]}",'NotaCredito.modificado' => "now()"),array('NotaCredito.id' => $numReferencia[1]));
                                    }elseif($numReferencia[0] == 4){ // Carta Orden
                                        $instrumentoPago[$indice]['InstrumentoPago']['carta_orden_id'] = $numReferencia[1];
                                        $objCartaOrden->updateAll(array('CartaOrden.pagado' => "CartaOrden.pagado + {$monto[$indice]}"),array('CartaOrden.id' => $numReferencia[1]));
                                        $dataNotaDebito=array();
                                        $dataNotaDebito['NotaDebito']['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                                        $dataNotaDebito['NotaDebito']['usuario_id'] = $usuarioID;
                                        $dataNotaDebito['NotaDebito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                                        $dataNotaDebito['NotaDebito']['cierre_caja_id'] = 0;
                                        $dataNotaDebito['NotaDebito']['numero'] = '001';
                                        $dataNotaDebito['NotaDebito']['nombre'] = 'FACTURA';
                                        $dataNotaDebito['NotaDebito']['monto'] = $monto[$indice];
                                        $dataNotaDebito['NotaDebito']['doc_referencia'] = '-----';
                                        $dataNotaDebito['NotaDebito']['id_referencia'] = $objFac->id;
                                        $dataNotaDebito['NotaDebito']['punto_id'] = $this->Session->read('punto_id');
                                        if($objNotaDebito->saveAll($dataNotaDebito)){
                                            //va bien jesus tiene que determinar como va a validar la transaccion
                                            $id_notas_carta[] = $objNotaDebito->id;
                                            $exito*=1;
                                        } else {
                                            //Fallo registro hay que deshacer todo
                                            $exito = 0;
                                            break;
                                        }
                                    }
                                    $numReferencia = null;
                                } else
                                    $numReferencia = (!empty($numReferencia[0])) ? $numReferencia[0] : null;

                                $instrumentoPago[$indice]['InstrumentoPago']['referencia'] = $numReferencia;
                                $instrumentoPago[$indice]['InstrumentoPago']['banco_id'] = (!empty($banco[$indice])) ? $banco[$indice] : 0;
                                $instrumentoPago[$indice]['InstrumentoPago']['porcentaje_ret'] = $porcentajeRet;
                                $instrumentoPago[$indice]['InstrumentoPago']['monto_ret'] = $montoRet;
                                $instrumentoPago[$indice]['InstrumentoPago']['porcentaje_ret_islr'] = $porcentajeRetIslr;
                                $instrumentoPago[$indice]['InstrumentoPago']['monto_ret_islr'] = $montoRetIslr;
                                $instrumentoPago[$indice]['InstrumentoPago']['usuario_id'] = $usuarioID;
                            }

                            if ($exito) {
                                if ($objInstrumento->saveAll($instrumentoPago)) {
                                    $factOriginal = $objFac->id;
                                    $res = $objFac->query("select fn_salida_factura('$tienda', {$objFac->id}, {$this->Session->read('punto_id')}, {$usuarioID}) as res");
                                    $resultado = explode('|', $res[0][0]['res']);
                                    if ($resultado[0] == 'true') {
                                        $num_fact_original = $resultado[1];
                                        $num_con_fact_original = $resultado[2];
                                        if($cambio > $monto_efectivo){ //GENERAR NOTA DE CREDITO
                                            $dataNotaCredito = array();
                                            $dataNotaCredito['NotaCredito']['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                                            $dataNotaCredito['NotaCredito']['usuario_id'] = $usuarioID;
                                            $dataNotaCredito['NotaCredito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                                            $dataNotaCredito['NotaCredito']['cierre_caja_id'] = 0;
                                            $dataNotaCredito['NotaCredito']['numero'] = '001';
                                            $dataNotaCredito['NotaCredito']['nombre'] = 'FACTURA';
                                            $dataNotaCredito['NotaCredito']['monto'] = round($cambio,2);
                                            $dataNotaCredito['NotaCredito']['doc_referencia'] = $num_fact_original;
                                            $dataNotaCredito['NotaCredito']['id_referencia'] = $objFac->id; 
                                            $dataNotaCredito['NotaCredito']['observacion'] = 'NOTA DE CREDITO GENERADA POR SOBRANTE DE FACTURA BAJO DOCUMENTO NRO '.$num_fact_original; 
                                            $dataNotaCredito['NotaCredito']['punto_id'] = $this->Session->read('punto_id');
                                            if($objNotaCredito->save($dataNotaCredito)){
                                                $res = $objNotaCredito->query("select fn_numero_credito('$tienda', {$objNotaCredito->id}, {$this->Session->read('punto_id')}) as res");
                                                $resultado2 = $res[0][0]['res'];
                                                if ($resultado2) {
                                                    $exito *= 1;
                                                    $actualizarMontoCambio = array();
                                                    $actualizarMontoCambio['Facturacion']['id'] = $objFac->id;
                                                    $actualizarMontoCambio['Facturacion']['cambio'] = 0;
                                                    $objFac->save($actualizarMontoCambio);
                                                } else
                                                    $exito = 0;
                                            }
                                        }
                                        if ($exito) {
                                            foreach ($id_notas_carta as $id_not) {
                                                $res = $objNotaDebito->query("select fn_numero_debito('$tienda', $id_not, {$this->Session->read('punto_id')}) as res");
                                                $resultado2 = $res[0][0]['res'];
                                                if ($resultado2) {
                                                    $exito*=1;
                                                } else {
                                                    $exito = 0;
                                                    break;
                                                }
                                            }

                                            foreach ($id_notas_credito as $id_not) {
                                                $res = $objNotaDebito->query("select fn_numero_debito('$tienda', $id_not, {$this->Session->read('punto_id')}) as res");
                                                $resultado2 = $res[0][0]['res'];
                                                if ($resultado2) {
                                                    $exito*=1;
                                                } else {
                                                    $exito = 0;
                                                    break;
                                                }
                                            }

                                            if(count($id_notas_carta)>0){
                                                $obse='NOTA DE DEBITO GENERADA POR CARTA ORDEN UTILIZADA EN FACTURA BAJO DOCUMENTO NRO '.$num_fact_original;
                                                $objNotaDebito->updateAll(array('NotaDebito.doc_referencia' => "'".$num_fact_original."'",'NotaDebito.observacion' => "'".$obse."'",'NotaDebito.modificado' => "now()"),array('NotaDebito.id' => $id_notas_carta));
                                            }

                                            if(count($id_notas_credito)>0){
                                                $obse='NOTA DE DEBITO GENERADA POR CREDITO UTILIZADO EN FACTURA BAJO DOCUMENTO NRO '.$num_fact_original;
                                                $objNotaDebito->updateAll(array('NotaDebito.doc_referencia' => "'".$num_fact_original."'",'NotaDebito.observacion' => "'".$obse."'",'NotaDebito.modificado' => "now()"),array('NotaDebito.id' => $id_notas_credito));
                                            }
                                            if ($totalServicios > 0) {
                                                $objFac->updateAll(array('Facturacion.monto' => "Facturacion.monto - {$totalServicios}"), array('Facturacion.id' => $objFac->id));

                                                $facturacionFlete = array();
                                                $facturacionFlete['numero'] = '001';
                                                $facturacionFlete['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                                                $facturacionFlete['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                                                $facturacionFlete['usuario_id'] = $usuarioID;
                                                $facturacionFlete['tipodeventa'] = $tipodeventa;
                                                $facturacionFlete['punto_id'] = $this->Session->read('punto_id');
                                                $facturacionFlete['cotizacion_id'] = $idCot;
                                                $facturacionFlete['fecha'] = 'now()';
                                                $facturacionFlete['monto'] = $totalServicios;
                                                $facturacionFlete['observaciones'] = (!empty($observaciones)) ? $observaciones : 'VERIFICAR OBSERVACION DE FACTURA';
                                                $facturacionFlete['cambio'] = 0;
                                                $facturacionFlete['padre_id'] = $objFac->id;
                                                $facturacionFlete['tipo'] = 'F';
                                                if ($objFac->saveAll($facturacionFlete)) {
                                                    $con = 0;
                                                    $facturacionDetalleServicios = array();
                                                    foreach ($detalleServicios as $indice => $valor) {
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['factura_id'] = $objFac->id;
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['material_id'] = $valor['Material']['id'];
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['usuario_id'] = $valor['Material']['usuario_id'];
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['almacen_id'] = $valor['Material']['almacen_id'];
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['cantidad'] = $valor['Material']['cantidad'];
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['precio'] = $valor['Material']['precio'];
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['costo'] = $valor['Material']['costo'];
                                                        $facturacionDetalleServicios[$con]['FacturacionDetalle']['impuesto'] = $valor['Material']['impuesto'];
                                                        $con++;
                                                    }
                                                    if ($objFacDet->saveAll($facturacionDetalleServicios)) {
                                                        $id_notas_carta = array();
                                                        $id_notas_credito = array();
                                                        $tienda = substr($this->Session->read('codigo_punto'), 1);
                                                        $monto_efectivo = 0;
                                                        $instrumentoPagoFlete = array();
                                                        foreach ($forma_pago_flete as $indice => $valor) {
                                                            if ($valor == 1) { // es efectivo ojo
                                                                $monto_efectivo = $monto_flete[$indice];
                                                            } elseif($valor == 12){ // Credito
                                                                $dataNotaDebito['NotaDebito']['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                                                                $dataNotaDebito['NotaDebito']['usuario_id'] = $usuarioID;
                                                                $dataNotaDebito['NotaDebito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                                                                $dataNotaDebito['NotaDebito']['cierre_caja_id'] = 0;
                                                                $dataNotaDebito['NotaDebito']['numero'] = '001';
                                                                $dataNotaDebito['NotaDebito']['nombre'] = 'FACTURA';
                                                                $dataNotaDebito['NotaDebito']['monto'] = $monto_flete[$indice];
                                                                $dataNotaDebito['NotaDebito']['doc_referencia'] = '-----';
                                                                $dataNotaDebito['NotaDebito']['id_referencia'] = $objFac->id;
                                                                $dataNotaDebito['NotaDebito']['punto_id'] = $this->Session->read('punto_id');
                                                                if ($objNotaDebito->saveAll($dataNotaDebito)) {
                                                                    //va bien jesus tiene que determinar como va a validar la transaccion
                                                                    $id_notas_credito[] = $objNotaDebito->id;
                                                                    $exito*=1;
                                                                } else {
                                                                    //Fallo registro hay que deshacer todo
                                                                    $exito = 0;
                                                                    break;
                                                                }
                                                            }
                                                            
                                                            if(in_array($valor, $formasPagoCredito))
                                                                $montoRestarFacFlete += $monto_flete[$indice];
                                                            
                                                            $porcentajeRet = $montoRet = $porcentajeRetIslr = $montoRetIslr = 0;
                                                            $detalleRetencion = $objRetencion->find('first', array('fields' => array('RetencionTarjeta.porreten', 'RetencionTarjeta.porreten_islr'), 'conditions' => array('RetencionTarjeta.estatus' => 1, 'RetencionTarjeta.formadepago_id' => $valor, 'RetencionTarjeta.banco_id' => $banco_flete[$indice])));

                                                            if (!empty($detalleRetencion)) {
                                                                $porcentajeRet = $detalleRetencion['RetencionTarjeta']['porreten'];
                                                                $montoRet = round($monto_flete[$indice] * ($detalleRetencion['RetencionTarjeta']['porreten'] / 100),2);
                                                                $porcentajeRetIslr = $detalleRetencion['RetencionTarjeta']['porreten_islr'];
                                                                //$montoRetIslr = round($monto_flete[$indice] * ($detalleRetencion['RetencionTarjeta']['porreten_islr'] / 100),2);
                                                                $montoRetIslr = round(($monto_flete[$indice]/112) * $detalleRetencion['RetencionTarjeta']['porreten_islr'],2);
                                                            }

                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['tipo_instrumento'] = 1; //Imagino esto es si es credito o contado
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['factura_id'] = $objFac->id;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['formapago_id'] = $valor;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['monto'] = $monto_flete[$indice];
                                                            $numReferencia = explode('_', $referencia_flete[$indice]);

                                                            if (count($numReferencia) > 1) {
                                                                if ($numReferencia[0] == 3) { // Nota de credito
                                                                    $instrumentoPagoFlete[$indice]['InstrumentoPago']['notacredito_id'] = $numReferencia[1];
                                                                    $objNotaCredito->updateAll(array('NotaCredito.pagado' => "NotaCredito.pagado + {$monto_flete[$indice]}",'NotaCredito.modificado' => "now()"),array('NotaCredito.id' => $numReferencia[1]));

                                                                }elseif($numReferencia[0] == 4){ // Carta Orden
                                                                    $instrumentoPagoFlete[$indice]['InstrumentoPago']['carta_orden_id'] = $numReferencia[1];
                                                                    $objCartaOrden->updateAll(array('CartaOrden.pagado' => "CartaOrden.pagado + {$monto_flete[$indice]}",'CartaOrden.modificado' => "now()"),array('CartaOrden.id' => $numReferencia[1]));

                                                                    $dataNotaDebito['NotaDebito']['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
                                                                    $dataNotaDebito['NotaDebito']['usuario_id'] = $usuarioID;
                                                                    $dataNotaDebito['NotaDebito']['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
                                                                    $dataNotaDebito['NotaDebito']['cierre_caja_id'] = 0;
                                                                    $dataNotaDebito['NotaDebito']['numero'] = '001';
                                                                    $dataNotaDebito['NotaDebito']['nombre'] = 'FACTURA';
                                                                    $dataNotaDebito['NotaDebito']['monto'] = $monto_flete[$indice];
                                                                    $dataNotaDebito['NotaDebito']['doc_referencia'] = '-----';
                                                                    $dataNotaDebito['NotaDebito']['id_referencia'] = $objFac->id;
                                                                    $dataNotaDebito['NotaDebito']['punto_id'] = $this->Session->read('punto_id');
                                                                    if ($objNotaDebito->saveAll($dataNotaDebito)) {
                                                                        //va bien jesus tiene que determinar como va a validar la transaccion
                                                                        $id_notas_carta[] = $objNotaDebito->id;
                                                                        $exito*=1;
                                                                    } else {
                                                                        //Fallo registro hay que deshacer todo
                                                                        $exito = 0;
                                                                        break;
                                                                    }
                                                                }
                                                                $numReferencia = null;
                                                            } else
                                                                $numReferencia = (!empty($numReferencia[0])) ? $numReferencia[0] : null;

                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['referencia'] = $numReferencia;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['banco_id'] = (!empty($banco_flete[$indice])) ? $banco_flete[$indice] : 0;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['porcentaje_ret'] = $porcentajeRet;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['monto_ret'] = $montoRet;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['porcentaje_ret_islr'] = $porcentajeRetIslr;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['monto_ret_islr'] = $montoRetIslr;
                                                            $instrumentoPagoFlete[$indice]['InstrumentoPago']['usuario_id'] = $usuarioID;
                                                        }

                                                        if ($exito) {
                                                            if ($objInstrumento->saveAll($instrumentoPagoFlete)) {
                                                                $res = $objFac->query("select fn_salida_factura('$tienda', {$objFac->id}, {$this->Session->read('punto_id')}, {$usuarioID}) as res");
                                                                $resultado = explode('|', $res[0][0]['res']);
                                                                if ($resultado[0] == 'true') {
                                                                    foreach ($id_notas_carta as $id_not) {
                                                                        $res = $objNotaDebito->query("select fn_numero_debito('$tienda', $id_not, {$this->Session->read('punto_id')}) as res");
                                                                        $resultado2 = $res[0][0]['res'];
                                                                        if ($resultado2) {
                                                                            $exito*=1;
                                                                        } else {
                                                                            $exito = 0;
                                                                            break;
                                                                        }
                                                                    }
                                                                    foreach ($id_notas_credito as $id_not) {
                                                                        $res = $objNotaDebito->query("select fn_numero_debito('$tienda', $id_not, {$this->Session->read('punto_id')}) as res");
                                                                        $resultado2 = $res[0][0]['res'];
                                                                        if ($resultado2) {
                                                                            $exito*=1;
                                                                        } else {
                                                                            $exito = 0;
                                                                            break;
                                                                        }
                                                                    }
                                                                    if($exito){
                                                                        if(count($id_notas_carta)>0){
                                                                            $obse='NOTA DE DEBITO GENERADA POR CARTA ORDEN UTILIZADA EN FACTURA BAJO DOCUMENTO NRO '.$resultado[1];
                                                                            $objNotaDebito->updateAll(array('NotaDebito.doc_referencia' => "'".$resultado[1]."'",'NotaDebito.observacion' => "'".$obse."'",'NotaDebito.modificado' => "now()"),array('NotaDebito.id' => $id_notas_carta));
                                                                        }
                                                                        if(count($id_notas_credito)>0){
                                                                            $obse='NOTA DE DEBITO GENERADA POR CREDITO UTILIZADO EN FACTURA BAJO DOCUMENTO NRO '.$resultado[1];
                                                                            $objNotaDebito->updateAll(array('NotaDebito.doc_referencia' => "'".$resultado[1]."'",'NotaDebito.observacion' => "'".$obse."'",'NotaDebito.modificado' => "now()"),array('NotaDebito.id' => $id_notas_credito));
                                                                        }
                                                                        
                                                                        $error = false;
                                                                    }
                                                                } else
                                                                    $msjError = $resultado[1];
                                                            }
                                                        }
                                                    }
                                                }
                                            } else
                                                $error = false;
                                        }
                                    } else
                                        $msjError = $resultado[1];
                                }
                            }
                            
                            if(isset($serial) && (count($serial) > 0)) {
                                $seriales = array();
                                $x = $i = 0;
                                foreach($serial as $indice => $valor) {
                                    $idPro = array_search($indice, $productos);
                                    for($j = 0; $j < $cantidades[$idPro]; $j++) {
                                        $seriales[$i]['FacturacionSerial']['factura_detalle_id'] = $detalleIds[$x];
                                        $seriales[$i]['FacturacionSerial']['serial'] = strtoupper($valor[$j]);
                                        $i++;
                                    }
                                    $x++;
                                }
                                if ($objDetSer->saveAll($seriales))
                                    $error = false;
                                else
                                    $msjError = 'Ocurri&oacute; un error al guardar los Seriales de los Materiales, favor intente de nuevo';
                            }
                        }
                    }
                }
            } else
                $msjError = 'La Cotizaci&oacute;n ya fu&eacute; procesada';

            if(!$error) {
                $validarCobranza = false;
                if(($facturacion['tipodeventa'] == 1) && ($genera_cobranza)) {
                    $objCobranza = $this->Maestro->modelo('punto', 'Cobranza', $tiendaSesion);
                    $objCobranzaDetalle = $this->Maestro->modelo('punto', 'CobranzaDetalle', $tiendaSesion);
                    $objInsPagoCob = $this->Maestro->modelo('punto', 'InstrumentoPagoCobranza', $tiendaSesion);
                    $cobranza['usuario_id'] = $usuarioID;
                    $cobranza['monto'] = ($montoPagar - $montoRestarCobranza);
                    $cobranza['fecha'] = 'now()';
                    $cobranza['cliente_id'] = $clienteID;
                    
                    if ($objCobranza->save($cobranza)) {
                        $montoCob = ($montoPagar - ($totalServicios + $montoRestarFac));
                        if($montoCob > 0) {
                            $cobranzaDetalle[0]['CobranzaDetalle']['cobranza_id'] = $objCobranza->id;
                            $cobranzaDetalle[0]['CobranzaDetalle']['factura_id'] = $factOriginal;
                            $cobranzaDetalle[0]['CobranzaDetalle']['monto'] = $montoCob;
                        }
                        
                        $montoCobFle = ($totalServicios - $montoRestarFacFlete);
                        if (($totalServicios > 0) && ($montoCobFle > 0)) {
                            $cobranzaDetalle[1]['CobranzaDetalle']['cobranza_id'] = $objCobranza->id;
                            $cobranzaDetalle[1]['CobranzaDetalle']['factura_id'] = $objFac->id;
                            $cobranzaDetalle[1]['CobranzaDetalle']['monto'] = $montoCobFle;
                        }
                        
                        if ($objCobranzaDetalle->saveAll($cobranzaDetalle)) {
                            $insPagoCob = $arrayFormasPago = array();
                            $i = 0;
                            foreach($instrumentoPago as $valor) {
                                if(!in_array($valor['InstrumentoPago']['formapago_id'], $formasPagoCredito)) {
                                    $arrayFormasPago[$i] = $valor['InstrumentoPago']['formapago_id'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['cobranza_id'] = $objCobranza->id;
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['notacredito_id'] = (isset($valor['InstrumentoPago']['notacredito_id'])) ? $valor['InstrumentoPago']['notacredito_id'] : 0;
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['formapago_id'] = $valor['InstrumentoPago']['formapago_id'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['monto'] = $valor['InstrumentoPago']['monto'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['referencia'] = $valor['InstrumentoPago']['referencia'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['banco_id'] = $valor['InstrumentoPago']['banco_id'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['porcentaje_ret'] = $valor['InstrumentoPago']['porcentaje_ret'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['monto_ret'] = $valor['InstrumentoPago']['monto_ret'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['porcentaje_ret_islr'] = $valor['InstrumentoPago']['porcentaje_ret_islr'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['monto_ret_islr'] = $valor['InstrumentoPago']['monto_ret_islr'];
                                    $insPagoCob[$i]['InstrumentoPagoCobranza']['usuario_id'] = $valor['InstrumentoPago']['usuario_id'];
                                    $i++;
                                }
                            }
                            if ($totalServicios > 0) {
                                $i = count($insPagoCob);
                                foreach($instrumentoPagoFlete as $valor2){
                                    if(!in_array($valor2['InstrumentoPago']['formapago_id'], $formasPagoCredito)) {
                                        $indice = array_search($valor2['InstrumentoPago']['formapago_id'], $arrayFormasPago);
                                        if($indice !== false) {
                                            $insPagoCob[$indice]['InstrumentoPagoCobranza']['monto'] += $valor2['InstrumentoPago']['monto'];
                                            $insPagoCob[$indice]['InstrumentoPagoCobranza']['monto_ret'] += $valor2['InstrumentoPago']['monto_ret'];
                                            $insPagoCob[$indice]['InstrumentoPagoCobranza']['monto_ret_islr'] += $valor2['InstrumentoPago']['monto_ret_islr'];
                                        } else {
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['cobranza_id'] = $objCobranza->id;
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['notacredito_id'] = (isset($valor2['InstrumentoPago']['notacredito_id'])) ? $valor2['InstrumentoPago']['notacredito_id'] : 0;
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['formapago_id'] = $valor2['InstrumentoPago']['formapago_id'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['monto'] = $valor2['InstrumentoPago']['monto'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['referencia'] = $valor2['InstrumentoPago']['referencia'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['banco_id'] = $valor2['InstrumentoPago']['banco_id'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['porcentaje_ret'] = $valor2['InstrumentoPago']['porcentaje_ret'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['monto_ret'] = $valor2['InstrumentoPago']['monto_ret'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['porcentaje_ret_islr'] = $valor2['InstrumentoPago']['porcentaje_ret_islr'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['monto_ret_islr'] = $valor2['InstrumentoPago']['monto_ret_islr'];
                                            $insPagoCob[$i]['InstrumentoPagoCobranza']['usuario_id'] = $valor2['InstrumentoPago']['usuario_id'];
                                            $i++;
                                        }
                                    }
                                }
                            }
                            if ($objInsPagoCob->saveAll($insPagoCob)) {
                                $validarCobranza = true;
                            } else {
                                $error = true;
                                $msjError = "Ocurri&oacute; un error al guardar los Instrumentos de Pago<br/>de la Cobranza, favor intente de nuevo";
                            }
                        } else {
                            $error = true;
                            $msjError = "Ocurri&oacute; un error al generar el detalle<br/>de la Cobranza, favor intente de nuevo";
                        }
                    } else {
                        $error = true;
                        $msjError = "Ocurri&oacute; un error al generar la Cobranza, favor intente de nuevo";
                    }
                } else
                    $validarCobranza = true;
                
                if($validarCobranza) {
                    if(!empty($detalleSuperv)){
                        $detalleSuperv = implode(',', $detalleSuperv);
                        $detalleSupervCant = implode(',', $detalleSupervCant);
                        $supervisacion = $this->Material->query("select fnc_productos_supervisados('$detalleSuperv', '$detalleSupervCant', {$this->Interfaz->id($this->request->data['id2'])})");
                    } else
                        $supervisacion[0][0] = true;

                    if($supervisacion[0][0]) {
                        $objFac->query('COMMIT');
                        $error = false;
                        echo "1_{$factOriginal}_{$num_fact_original}_{$num_con_fact_original}";
                    } else {
                        $error = true;
                        $msjError = "Ocurri&oacute; un error al guardar, favor intente de nuevo";
                    }
                }
            }
            
            if($error) {
                $objFac->query('ROLLBACK');
                if($guardaFactura) {
                    $infoCotizacion = array('id' => $idCot, 'estatus' => 1, 'fecha_procesada' => '');
                    $objCot->save($infoCotizacion);
                }
                if (count($errores) == 0)
                    echo "2_$msjError";
            }
            $this->autoRender = false;
        }
    }
    
    public function formas_pago() {
        extract($this->request->data);
        $id = $this->Interfaz->id($idFac);
        $idCli = $this->Interfaz->id($idCli);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFact = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
        $objInstrumento = $this->Maestro->modelo('punto', 'InstrumentoPago', $tiendaSesion);
        $objCarOrd = $this->Maestro->modelo('punto', 'CartaOrden', $tiendaSesion);
        $objNotCre = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        
        $dataFacturaFlete = $objFact->find('first', array('fields' => 'Facturacion.id', 'conditions' => array('Facturacion.padre_id' => $id)));
        $arrayIds = array();
        $arrayIds[] = $id;
        
        if(!empty($dataFacturaFlete))
            $arrayIds[] = $dataFacturaFlete['Facturacion']['id'];
        
        $cambio = $objFact->find('first', array('fields' => 'cambio', 'conditions' => array('Facturacion.id' => $id)));
        $objInstrumento->virtualFields = array('monto' => 'SUM(InstrumentoPago.monto)');
        $formasPago = $objInstrumento->find('all', array('fields' => array('InstrumentoPago.referencia', 'InstrumentoPago.notacredito_id', 'InstrumentoPago.carta_orden_id', 'InstrumentoPago.banco_id', 'InstrumentoPago.formapago_id', 'monto'),
                                                        'conditions' => array('InstrumentoPago.factura_id' => $arrayIds),
                                                        'order' => array('InstrumentoPago.formapago_id'),
                                                        'group' => array('InstrumentoPago.referencia', 'InstrumentoPago.notacredito_id', 'InstrumentoPago.carta_orden_id', 'InstrumentoPago.banco_id', 'InstrumentoPago.formapago_id')));
        $listaCartas = $objCarOrd->find('list', array('fields' => 'id, numero', 'conditions' => array('CartaOrden.cliente_id' => $idCli), 'order' => 'CartaOrden.numero'));
        $listaNotas = $objNotCre->find('list', array('fields' => 'id, numero', 'conditions' => array('NotaCredito.cliente_id' => $idCli), 'order' => 'NotaCredito.numero'));
        $listaNotasFactura = $objNotCre->find('first', array('fields' => 'numero, monto', 'conditions' => array('NotaCredito.id_referencia' => $id, 'NotaCredito.nombre' => 'FACTURA')));
        
        $this->set('data', $formasPago);
        $this->set('cambio', $cambio);
        $this->set('listaBancos', $this->Maestro->lista_bancos());
        $this->set('listaFormasPago', $this->Maestro->lista_formas_pago());
        $this->set('listaCartas', $listaCartas);
        $this->set('listaNotas', $listaNotas);
        $this->set('listaNotasFac', $listaNotasFactura);
    }
    
    public function verificarNumRef() {
        extract($this->request->data);
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objInstrumento = $this->Maestro->modelo('punto', 'InstrumentoPago', $tiendaSesion);
        $errores = array();
        
        foreach($forma_pago as $indice => $valor) {
            if($banco[$indice] > 0) {
                $validarNumRef = $objInstrumento->find('first', array('fields' => 'id', 'conditions' => array('InstrumentoPago.formapago_id' => $valor, 'InstrumentoPago.referencia' => $referencia[$indice], 'InstrumentoPago.banco_id' => $banco[$indice], 'CAST(InstrumentoPago.creado AS DATE) !=' => date('d-m-Y'))));
                if(!empty($validarNumRef)) {
                    $errores[$indice]['numero'] = ($indice + 1);//"Número de Referencia '$referencia[$indice]' duplicado, revisar Forma de Pago Nro (" . ($indice + 1) . ")";
                    $errores[$indice]['num_ref'] = $referencia[$indice];
                }
            }
        }
        
        if (count($errores) > 0)
            echo json_encode($errores);
        else
            echo "1";
        $this->autoRender = false;
    }
    
    public function validarSeriales() {
        extract($this->request->data);
        $productos = json_decode($productos, true);
        $errores = array();
        $tiendaSesion = $this->Session->read('tiendaBD');
        $objFactSer = $this->Maestro->modelo('punto', 'FacturacionSerial', $tiendaSesion);
        
        $idEliminar = array_search(1, $productos);
        unset($productos[$idEliminar]);

        foreach($productos as $indice => $valor) {
            foreach($serial[$valor] as $indice2 => $valor2) {
                $valor2 = strtoupper($valor2);
                $duplicado = $objFactSer->find('first', array('fields' => 'FacturacionDetalle.id', 'conditions' => array('FacturacionSerial.estatus' => 1, 'FacturacionSerial.serial' => $valor2, 'FacturacionDetalle.material_id' => $valor)));
                if(!empty($duplicado)) {
                    $posicionMaterial = $indice + 1;
                    $posicionSerial = $indice2 + 1;
                    $errores[$posicionMaterial][$posicionSerial]['posicion'] = $posicionSerial;
                }
            }
        }
        
        if (count($errores) > 0)
            echo json_encode($errores);
        else
            echo "1";
        
        $this->autoRender = false;
    }
    
    public function generarCotizacion($data) {
        extract($data);
        $productos = json_decode($productos, true);
        $cantidades = json_decode($cantidades, true);
        $nuevoID = str_replace('-', '', $num_form);
        $fecha = "fecha_$nuevoID";
        $programa_id = "programa_id_$nuevoID";
        $programa_id = $$programa_id;
        $tipodeventa = "tipodeventa_$nuevoID";
        $tipodeventa = $$tipodeventa;
        $lapso_id = "lapso_id_$nuevoID";
        $lapso_id = $$lapso_id;
        $fechaFinal = $$fecha;
        $fechaGuardar = "$fechaFinal " . date('h:i:s');
        $lapso_id = (!empty($lapso_id)) ? $lapso_id : 1;
        $cotizacion['numcot'] = '001';
        $cotizacion['cliente_id'] = $this->Interfaz->id($this->request->data['id2']);
        $cotizacion['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
        $cotizacion['punto_id'] = $this->Session->read('punto_id');
        $cotizacion['tipo_cliente_id'] = (!empty($tipo_cliente_id)) ? $tipo_cliente_id : 1;
        $cotizacion['fecha'] = 'now()';
        $cotizacion['monto'] = $montoPagar;
        $cotizacion['observaciones'] = "CADUCA A LOS TRES (03) DIAS DE EMITIDA";
        if (!empty($observacion))
            $cotizacion['observaciones'] .= " - {$this->Interfaz->mayuscula($observacion)}";
        $cotizacion['tipodeventa'] = $tipodeventa;
        $cotizacion['lapso_id'] = $lapso_id;
        $cotizacion['programa_id'] = $programa_id;
        $cotizacion['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCot = $this->Maestro->modelo('punto', 'Cotizacion', $tiendaSesion);
        $objCotDet = $this->Maestro->modelo('punto', 'CotizacionDetalle', $tiendaSesion);

        $objCot->query('BEGIN WORK');
        if ($objCot->save($cotizacion)) {
            $detalleProductos = $this->buscar_producto($productos, $cotizacion['tipo_cliente_id'], $programa_id, $lapso_id, $fechaFinal);
            $cotizacionDetalle = array();
            $errores = array();
            foreach ($detalleProductos as $indice => $valor) {
                $idPro = array_search($valor['Material']['id'], $productos);
                $cantSuperv = $cantidades[$idPro] + $valor['Material']['venta'];
                if (
                    ($cantidades[$idPro] > $valor['Material']['existencia']) ||
                    (empty($valor['Material']['existencia'])) ||
                    ($valor['Material']['existencia'] <= 0) ||
                    (empty($valor['Material']['precio'])) ||
                    ($valor['Material']['precio'] <= 0) ||
                    (($valor['Material']['maximo'] > 0) && ($cantSuperv > $valor['Material']['maximo']))
                ) {
                    $errores[$valor['Material']['id']]['error'] = '';
                    if (($cantidades[$idPro] > $valor['Material']['existencia']) || (empty($valor['Material']['existencia'])) || ($valor['Material']['existencia'] <= 0))
                        $errores[$valor['Material']['id']]['error'] = "La Cantidad escogida supera la Existencia";
                    if ((empty($valor['Material']['precio'])) || ($valor['Material']['precio'] <= 0)) {
                        $errores[$valor['Material']['id']]['error'] .= (!empty($errores[$valor['Material']['id']]['error'])) ? '<br/>' : '';
                        $errores[$valor['Material']['id']]['error'] .= "El precio del producto es invalido";
                    }
                    if ($cantSuperv > $valor['Material']['maximo']) {
                        $errores[$valor['Material']['id']]['error'] .= (!empty($errores[$valor['Material']['id']]['error'])) ? '<br/>' : '';
                        $errores[$valor['Material']['id']]['error'] .= "Supera la cantidad maxima permitida de venta";
                    }
                    $errores[$valor['Material']['id']]['nombre'] = "({$valor['Material']['codigo']})<br/>{$valor['Material']['nombre']}";
                    $errores[$valor['Material']['id']]['precio'] = $valor['Material']['precio'];
                    $errores[$valor['Material']['id']]['cantidad'] = $cantidades[$idPro];
                    $errores[$valor['Material']['id']]['existencia'] = $valor['Material']['existencia'];
                    $errores[$valor['Material']['id']]['vendido'] = $cantSuperv;
                    $errores[$valor['Material']['id']]['maximo'] = ($valor['Material']['maximo'] - $valor['Material']['venta']);
                } else {
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['cotizacion_id'] = $objCot->id;
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['material_id'] = $valor['Material']['id'];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['usuario_id'] = $cotizacion['usuario_id'];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['almacen_id'] = 1;
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['cantidad'] = $cantidades[$idPro];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['precio'] = $valor['Material']['precio'];
                    $cotizacionDetalle[$indice]['CotizacionDetalle']['impuesto'] = $valor['Material']['impuesto'];
                }
            }

            if (count($errores) > 0) {
                $objCot->query('ROLLBACK');
                echo json_encode($errores);
            } else {
                if ($objCotDet->saveAll($cotizacionDetalle)) {
                    $tienda = substr($this->Session->read('codigo_punto'), 1);
                    $res = $objCot->query("select fn_numero_cotizacion('$tienda', {$objCot->id}, {$this->Session->read('punto_id')}) as res");
                    $resultado = explode('|', $res[0][0]['res']);
                    if ($resultado[0] == 'true') {
                        $objCot->query('COMMIT');
                        $id = "1_{$this->Interfaz->id_encode($objCot->id)}";
                    } else {
                        $objCot->query('ROLLBACK');
                        $id = "2_{$resultado[1]}";
                    }
                }
            }
        } else {
            $objCot->query('ROLLBACK');
            $id = "2_";
        }
        
        return $id;
    }

}
